package com.huonan.component.web;

import com.mz.social.common.web.meta.ErrorCode;

/**
 * 错误码
 *
 * @author zhengjipan
 * @since 2019/9/29
 */
public enum CustomErrorCode implements ErrorCode {
    //---------------------------------------------------------------------||
    //                         通用错误码                                  |
    //---------------------------------------------------------------------\/
    /**
     * 请求成功
     */
    SUCCESS(200, "success"),
    /**
     * 参数错误
     */
    PARAM_ERROR(400, "参数错误"),

    /**
     * 用户认证失败
     */
    AUTHENTICATION_FAIL(401, "该账号异常，请重新登录"),

    /**
     * 授权失败
     */
    AUTHORIZATION_FAIL(403, "授权失败"),

    /**
     * 资源未找到
     */
    NOT_FOUND(404, "资源未找到"),

    /**
     * 当前用户未绑定角色信息
     */
    NOT_BIND_ROLE(409, "该账号尚未开通SocialX，请联系您的管理员。"),

    /**
     * 当前权限为空
     */
    PERMISSION_EMPTY(411, "该账号异常，请联系您的管理员。"),

    /**
     * passport登录过于频繁，已被限制，稍后再试
     */
    TTC_LOGIN_OFTEN_ERROR(416, "您的账号登录过于频繁，请等待1个小时后再试。"),

    /**
     * passport已将账号冻结
     */
    TTC_LOGIN_ACCOUNT_FORBIDDEN_ERROR(417, "您的账号已被冻结，请联系您的顾问。"),

    /**
     * 参数中的域名不在白名单中
     */
    DOMAIN_WHITE_LIST_NOT_MATCHED_ERROR(418, "系统异常，请联系您的管理员。"),

    //---------------------------------------------------------------------||
    //                           登录错误码200开头                            |
    //---------------------------------------------------------------------\/

    /**
     * 用户登录失败
     */
    LOGIN_FAIL(200001, "用户登录失败，请重新登录"),

    /**
     * 用户名为空
     */
    USERNAME_EMPTY(200002, "用户名不能为空"),

    /**
     * 用户名或密码错误
     */
    USERNAME_PASSWORD_ERROR(200003, "用户名或者密码错误"),

    /**
     * 租户信息为空
     */
    TENANT_EMPTY(200004, "该账号已被停用，请联系您的管理员。"),

    /**
     * 该账号异常，请联系您的管理员
     */
    LOGIN_ACCOUNT_ERROR(200006, "该账号异常，请联系您的管理员"),

    /**
     * 登录已过期
     */
    LOGIN_INVALID_ERROR(200007, "登录已过期，请重新登录"),

    /**
     * 密码已过期
     */
    PASSWORD_EXPIRE(200008, "密码已过期，请修改密码后重试"),

    /**
     * 无产品权限
     */
    USER_NO_PRODUCT_PERMISSION_ERROR(200009, "该账号尚未开通权限，请联系您的管理员"),

    /**
     * 禁用
     */
    USER_FORBIDDEN_PERMISSION_ERROR(200010, "该账号已被停用，请联系您的管理员。"),

    /**
     * 您的组织刚刚发生了变化，已为您更新。
     */
    NEED_RETRY_REFRESH(200011, "您的组织刚刚发生了变化，已为您更新"),

    /**
     * passport登录过于频繁，已被限制，稍后再试
     */
    LOGIN_OFTEN_ERROR(200013, "该账号频繁登录，请一小时后再试"),

    /**
     * passport已将账号冻结
     */
    LOGIN_ACCOUNT_FORBIDDEN_ERROR(200014, "该账号已冻结，请联系passport"),

    /**
     * 无效的域名
     */
    DOMAIN_INVALID_ERROR(200015, "无效的域名"),

    /**
     * 参数错误，包含空值
     */
    PARAM_NULL_ERROR(400001, "客户端参数错误,包含了非法空值"),

    /**
     * 参数错误，超出合法范围
     */
    PARAM_RANGE_ERROR(400002, "客户端参数错误,包含了非法范围值"),

    /**
     * 上传文件大小超过限制
     */
    MAX_UPLOAD_SIZE_EXCEEDED_ERROR(400003, "文件大小超过限制"),

    /**
     * 未知异常
     */
    UNKNOW_ERROR(500, "未知错误，请联系管理员"),

    /**
     * 数据库异常
     */
    DATABASE_ERROR(500100, "数据库操作失败"),

    /**
     * 数据库服务不可达
     */
    DATABASE_UNAVAILABLE_ERROR(500101, "数据库服务不可达"),


    /**
     * Redis通用错误
     */
    REDIS_ERROR(500200, "Redis系统错误"),

    /**
     * Redis服务不可达
     */
    REDIS_UNAVAILABLE_ERROR(500201, "Redis服务不可达"),

    /**
     * Redis锁失败
     */
    REDIS_LOCK_ERROR(500202, "Redis锁获取失败"),

    /**
     * es服务器异常
     */
    ES_SERVER_ERROR(500300, "ES服务器异常"),

    /**
     * ES服务器PING超时
     */
    ES_SERVER_UNAVAILABLE_ERROR(500301, "ES服务器服务不可达"),

    /**
     * ES服务器负载过高
     */
    ES_SERVER_LOAD_HIGH(500303, "ES服务器负载过高"),


    /**
     * 算法计算失败
     */
    ALGORITHM_ERROR(500400, "算法计算失败"),

    /**
     * 业务错误
     */
    BUSINESS_ERROR(500500, "业务异常"),
    /**
     * HTTP调用失败
     */
    HTTP_INVOKE_ERROR(500501, "HTTP调用失败！"),

    DOWNLOAD_ERROR(500502, "下载异常"),

    /**
     * 数据导入异常
     */
    FILE_IMPORT_ERROR(500601, "数据导入异常"),
    FILE_FORMAT_ERROR(500602, "文件格式错误"),
    FILE_PARSE_ERROR(500603, "文件解析失败"),
    FILE_IMPORT_COLUMN_ERROR(500604, "导入失败！导入表列名与模板不一致，请调整后重新导入"),
    FILE_WRITE_ERROR(500605, "文件写入异常"),
    FILE_READ_ERROR(500606, "文件读取异常"),

    FILE_IMPORT_NO_DATA(500607, "无导入数据"),

    FILE_IMPORT_DATA_EXCEED_LIMIT(500608, "导入数据量超过限制"),

    FILE_UNZIP_ERROR(500609, "文件解压异常"),
    FILE_UNZIP_FILE_EMPTY(500610, "文件解压后无文件"),

    FILE_STREAM_READ_ERROR(500611, "流式读取文件失败"),

    /**
     * 调用sftp服务异常
     */
    SFTP_SERVER_ERROR(500800, "调用sftp服务异常"),
    SFTP_UPLOAD_ERROR(500801, "上传文件到sftp服务失败"),
    SFTP_DOWNLOAD_ERROR(500802, "下载sftp服务文件失败"),

    //---------------------------------------------------------------------||
    //                         业务异常码                                    |
    //---------------------------------------------------------------------\/
    // 600000 字典相关错误码
    DICTIONARY_EXISTS(600001, "记录已存在"),
    DICTIONARY_NOT_EXISTS(600002, "记录不存在"),

    DICTIONARY_NOT_FIND_RELATION(600003, "未获取到关联信息"),

    DICTIONARY_PLATFORM_EXIST_SOURCE(600004, "{}平台已关联站点，请先更新站点所属平台之后再进行删除操作"),
    DICTIONARY_RELATE_PROJECT(600005, "{}已关联项目，请先更新项目后再进行删除操作"),
    DICTIONARY_RELATE_SEED_SET(600006, "{}已关联种子集，请先更新种子集后再进行删除操作"),
    DICTIONARY_RELATE_SEED(600007, "{}已关联种子，请先更新种子后再进行删除操作"),


    // 600100 种子集相关错误码
    SEED_SET_EXISTS(600101, "种子集已存在"),
    SEED_SET_NOT_EXISTS(600102, "种子集不存在"),
    SEED_SET_HAS_SEEDS(600103, "种子集下存在种子"),
    SEED_SET_RELATE_PROJECT(600104, "种子集已关联项目"),

    // 600200 项目相关错误码
    PROJECT_EXISTS(600201, "项目已存在"),
    PROJECT_NOT_EXISTS(600202, "项目不存在"),

    // 600300 种子相关错误码
    ORI_SEED_EXISTS(600301, "种子已存在"),
    ORI_SEED_NOT_EXISTS(600302, "种子不存在"),
    SEED_QUERY_FIELD_NOT_EXISTS(600303, "不存在的字段"),
    SEED_TYPE_ERROR(600304, "种子类型错误"),
    SEED_PULL_TYPE_NOT_SUPPORT_FREQUENCY(600305, "该采集方式不支持选择的更新频率"),

    SEED_EXPIRED_TIME_ERROR(600306, "种子过期时间不能早于当前时间"),

    SEED_FREQUENCY_ERROR(600307, "更新频率不正确"),

    SEED_SEED_TYPE_NOT_SUPPORT_DATA_TYPE(600308, "种子分类不支持的数据分类"),

    // 600400 项目字段相关错误码
    PROJECT_FIELD_EXISTS(600401, "项目已存在该字段"),
    PROJECT_FIELD_NOT_EXISTS(600402, "项目不存在该字段"),
    PROJECT_FIELD_IMPORT_ERROR(600403, "项目字段导入错误"),
    PROJECT_CHANNEL_INTERSECTION_NULL(600404, "参数传入频道与项目频道交集为空"),


    // 600500 字段相关错误码
    FIELD_KEY_EXISTS(600501, "字段英文名已存在"),
    FIELD_NAME_EXISTS(600502, "字段中文名已存在"),
    FIELD_NOT_EXISTS(600503, "字段不存在"),
    FIELD_NOT_SUPPORT_TYPE(600504, "不支持的数据类型"),
    MISS_FIELD_NAME_CN(600505, "缺失字段中文名"),
    MISS_FIELD_NAME_EN(600506, "缺失字段英文名"),
    MISS_FIELD_TYPE(600507, "缺失字段类型"),
    MISS_FIELD_REQUIRED(600508, "缺失必填信息"),
    MISS_FIELD_STATUS(600509, "缺失状态信息"),
    FIELD_TYPE_ERROR(600510, "字段类型错误"),
    FIELD_DOC_TYPE_ERROR(600511, "字段数据分类错误"),
    FIELD_REQUIRED_ERROR(600512, "是否必填错误(是/否)"),
    FIELD_STATUS_ERROR(600513, "状态错误(启用/停用"),
    MISS_FIELD_ATTR(600514, "缺失字段信息"),

    // 600600 供应商相关错误码
    SUPPLIER_NAME_EXISTS(600601, "供应商中文名已存在"),
    SUPPLIER_NAME_EN_EXISTS(600602, "供应商英文名已存在"),
    SUPPLIER_NOT_EXISTS(600603, "供应商不存在"),
    SUPPLIER_EXISTS_PROJECT(600604, "所选供应商下存在项目，禁止删除"),

    // 600700 数据分类相关错误码
    DATA_TYPE_ERROR(600701, "数据分类错误"),

    // 600800 供应商推送记录相关错误码
    SUPPLIER_PUSH_RECORD_PUSH_PATH_ERROR(600801, "文件推送路径错误"),;


    private Integer code;
    private String message;

    CustomErrorCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public CustomErrorCode detail(String message) {
        this.message = message;
        return this;
    }

    public static CustomErrorCode getByCode(Integer code) {
        for (CustomErrorCode errorCode : values()) {
            if (errorCode.getCode().equals(code)) {
                return errorCode;
            }
        }
        return null;
    }

    @Override
    public Integer getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }
}
